Sessions multiples/longues ************************** Dès que vos traitements dépassent 30 minutes, il ne vous sera plus possible de travailler comme avant. S'il semble acceptable d'attendre la fin d'un calcul prenant 5 à 10 minutes, il n'est plus pensable d'agir ainsi sur un traitement qui prend plusieurs heures ou plusieurs jours. Nous allons voir les différentes options fournis par Colab pour avoir une approche plus professionnelle. Rappels ======= Allouer une machine virtuelle ----------------------------- Lorsque vous ouvrez un notebook dans Colab, son contenu est alors affiché dans votre navigateur. A ce niveau, il ne consomme aucune ressource, c'est un peu comme une page web ou un fichier texte que l'on consulte. Aucune ressource n'est associée à ce notebook. En haut à droite de la page, vous pouvez voir l'icône suivant : .. image:: connecter.png Dès que vous lancez l'exécution d'une cellule, une machine virtuelle est instanciée pour exécuter votre traitement. Cette machine virtuelle reste active une fois le traitement terminé : * Les fichiers présents sur l'espace disque sont toujours disponibles. * La RAM n'est pas libérée, toutes les données sont conservées en mémoire. Ainsi, lorsque vous exécutez une autre cellule, les données en RAM et les fichiers sur le disque restent disponibles. Une vignette en haut à droite du notebook vous résume les ressources consommées par la machine virtuelle : .. image:: info.png Vous pouvez cliquer sur le triangle ▼ et choisir **Afficher les ressources** pour obtenir un affichage plus complet : .. image:: info2.png Fermer votre session -------------------- Ferme l'onglet de votre navigateur ou quitter le navigateur ne clôt pas votre session notebook pour autant. En effet, la machine virtuelle reste active sur le serveur Colab et continue à consommer des ressources. Est-ce important de savoir cela ? Oui car : * **Si vous fermez votre onglet par erreur**, vous n'avez rien perdu. Il suffit de vous connecter à Colab, de cliquer sur le triangle ▼ et de choisir **Gérer les sessions**. Cliquez alors sur le nom du notebook que vous aviez fermé par erreur pour le retrouver comme vous l'aviez laissé. * **Si vous gérez plusieurs notebooks à la fois**, il faut fermer ceux qui ne servent plus car vous êtes limité à 2/3 notebooks actifs. **Pour fermer une session proprement**, cliquez sur le triangle ▼ et choisissez **Déconnecter et supprimer l'environnement d'exécution**. Si le titre peut sembler un peu inquiétant, il rappelle juste qu'en fermant la machine virtuelle associée à votre notebook, vous libérez la RAM et l'espace disque associée et donc toutes les données présentes sont perdues. C'est donc une perte définitive. Les autres machines virtuelles/notebooks ne sont pas impactées. Sessions multiples ================== Testez le nombre de sessions disponibles ---------------------------------------- Malgré une interface assez simple, Colab permet de gérer plusieurs machines virtuelles. Vous avez ainsi droit à 2 ou 3 instances en parallèle. Pour tester cela, voici un code qui ne fait rien de spécial sinon lancer un traitement long : .. code-block:: !pip install -q keras-nightly import os import numpy as np os.environ["KERAS_BACKEND"] = "torch" import keras FashionMNIST = keras.datasets.fashion_mnist.load_data() (train_images, train_labels), (test_images, test_labels) = FashionMNIST model = keras.Sequential() model.add(keras.Input(shape=(28,28))) model.add(keras.layers.Flatten()) model.add(keras.layers.Dense(128, activation="relu")) model.add(keras.layers.Dense(10, activation="relu")) model.compile(optimizer='adam', loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) model.fit(x=train_images, y=train_labels, epochs=10000) Créez quatre notebooks dans Colab utilisant chacun le code ci-dessus. **Nous vous recommandons de leur donner des noms différents** afin de vous y retrouver plus facilement. Les noms *Notebook1*, *Notebook2*, ... peuvent suffire ! Lancez ensuite successivement le traitement demandé dans chaque notebook. Au 4-ième essai, vous devriez obtenir le message d'erreur suivant : .. image:: tropsessions.png :scale: 70% Cliquez alors sur : **Gérer les sessions**. Vous allez voir apparaître la liste des notebooks actifs : .. image:: sessionsactives.png :scale: 70% .. warning:: Attention, à ce niveau, on peut facilement se mélanger. La liste présentée ici n'est pas une liste de notebooks actifs à proprement parler mais une liste de machines virtuelles. Comme ces machines ne portent pas de nom, elles sont identifiées par le notebook en cours d'exécution. C'est pour cela qu'il est intéressant d'avoir des noms de notebooks différents pour pouvoir distinguer les différentes machines virtuelles. .. warning:: Attention, si un notebook n'effectue aucun traitement, du point de vue de Colab, une machine virtuelle lui est cependant attrivuée et il est donc comptabilisé comme actif car consommant 1 ressource, même si aucune cellule ne fait de calculs actuellement. Cette interface permet d'identifier les notebooks actifs (associés à une VM) et ainsi de fermer les notebooks inutiles en cliquant sur l'icône poubelle. Gérer les sessions multiples ---------------------------- Pour vérifier les sessions actives, depuis n'importe quel notebook, cliquez sur le triangle ▼ et de choisissez **Gérer les sessions**. Vous avez donc la liste des notebooks actifs et vous pouvez fermer ce que vous voulez. Effectuer un traitement long ============================ Comme on l'a vu précédemment, ferme la page web ne ferme pas la machine virtuelle. Cela a un énorme avantage car vous disposez de l'équivalent d'un serveur de calcul ! De plus, vous vous y connectez simplement à travers un notebook faisant office de telnet. De cette façon, vous pouvez **lancer un traitement de plusieurs heures** sans mobiliser votre machine personnelle. Test ---- Si vous n'avez pas conservé un notebook de la section précédente, recréez un notebook effectuant un calcul assez long. Ensuite, fermez l'onglet de votre navigateur associé à ce notebook. Vous obtiendrez le message suivant : .. image:: msg.png Ce message concerne en fait les cellules du notebook que vous n'avez peut être pas sauvegardées en quittant, cette information ne concerne en rien la machine virtuelle, ne pas en tenir compte. Ensuite, ouvrez un nouvel onglet et reconnectez vous à Colab. Cliquez sur le triangle ▼ et choisissez **Gérer les sessions**. Sélectionnez alors le notebook dont on vient de fermer l'onglet. Comme vous pouvez le constater le notebook est toujours actif : .. image:: epoch.png :scale: 80% Si vous n'êtes pas convaincu, fermez tous les onglets de votre navigateur, éteignez votre machine et allez faire un tour 10 minutes. Ensuite, reconnectez-vous à Colab. Cliquez sur le triangle ▼ et de choisissez **Gérer les sessions**, sélectionnez alors le même notebook. Comme vous pouvez le constater, en votre absence, votre instance a continué à travailler : .. image:: epoch2.png .. warning:: Si vous laissez des machines virtuelles ouvertes, n'oubliez pas de les arrêter. En effet, fermer le navigateur ne ferme pas vos sessions ! Et utiliser inutilement trop de sessions pendant plusieurs heures consomment votre temps de calcul alloué gratuitement. Faîtes attention ! .. warning:: Fermez les sessions de calcul précédentes !!! .. note:: Combien de temps les notebooks peuvent-ils s'exécuter dans Colab ? Voici la `réponse officielle de Google `_ : "En règle générale, la durée d'exécution maximale des notebooks est de 12 heures, selon la disponibilité et vos habitudes d'utilisation." Archiver la progression du réseau ================================= Il ne faut pas rêver, il est difficile de garder une session Colab ouverte sur plusieurs jours. On peut citer plusieurs contraintes : * Vous disposez de ressources prêtées gratuitement par Google, il se peut qu'afin d'éviter certains abus, des sessions soient fermées automatiquement après une certaine durée de fonctionnement. Cela permet aussi de se prémunir des sessions zombies qui tournent alors que l'utilisateur les a oubliées. * Vous êtes non prioritaire par rapport aux utilisateurs payants (pro). En cas de forte demande, vous passez à la trappe. Ne vous sentez pas mal-traités, les utilisateurs pros sont aussi éjectés dans les périodes de forte demande afin de faire de la place aux autres ! * Il y a des maintenances et aussi des plantages qui conduisent à la déconnexion ou à la perte de vos machines virtuelles. Inutile de se poser trop de questions, il est impossible de connaître la raison de fermeture de votre session. Cependant, on peut et on doit dès qu'un traitement se déroule sur plusieurs heures gérer cet aspect. Le principe des callbacks ------------------------- Keras, à la fin de chaque epoch, peut appeler divers traitements supplémentaires, généralement pour effectuer du monitoring. Pour cela, sont passés en arguments de la fonction *fit()* les fonctions/objets à rappeler, d'où le terme de "callback". Prenons un exemple simple, pour cela, démarrez une session Colab et créez le modèle suivant : .. code-block:: !pip install -q keras-nightly import os import numpy as np os.environ["KERAS_BACKEND"] = "torch" import keras FashionMNIST = keras.datasets.fashion_mnist.load_data() (train_images, train_labels), (test_images, test_labels) = FashionMNIST model = keras.Sequential() model.add(keras.Input(shape=(28,28))) model.add(keras.layers.Flatten()) model.add(keras.layers.Dense(128, activation="relu")) model.add(keras.layers.Dense(10, activation="relu")) model.compile(optimizer='adam', loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) Dans le bandeau de gauche, cliquez sur l'icône de répertoire. Effectuez un clic droit dans la zone du disque et choisissez *Nouveau dossier* et créez un répertoire nommé *test*. .. image:: callback.png :scale: 70% Cette fois, nous lançons l'entraînement en donnant une liste de callbacks. Nous utilisons pour cela le callback *ModelCheckpoint* fourni par Keras permettant de sauvegarder le réseau sur le disque à chaque fin d'epoch. .. code-block:: callbacks = [ keras.callbacks.ModelCheckpoint("/content/test/save_at_{epoch}.keras", verbose = True) ] model.fit(x=train_images, y=train_labels, epochs=3,callbacks=callbacks) L'option *verbose* permet d'informer l'utilisateur des actions effectuées lors de chaque callback : .. image:: verbose.png :scale: 70% Une fois ce modèle exécuté, nous avons au bout de trois epochs les fichiers suivants dans le répertoire *test* : .. image:: callback2.png :scale: 70% .. note:: Nous n'allons pas conserver une sauvegarde par epoch car cela va générer un trop grand nombre de fichiers. Nous l'avons fait ici uniquement à titre d'exemple. Garder une copie du réseau -------------------------- En cas d'arrêt subi de votre session, nous avons vu que toutes les informations sur le disque étaient perdues. Il faut donc sauvegarder directement le réseau courant sur votre Google Drive dont les données sont persistantes. Pour cela, il faut d'abord monter le disque : .. code-block:: from google.colab import drive drive.mount('/content/GoogleDrive/') Ensuite, on utilise le callback habituel pour exporter l'état courant du réseau sur le drive : .. code-block:: destination = '/content/GoogleDrive/MyDrive/network.keras' callbacks = [ keras.callbacks.ModelCheckpoint(destination, verbose = True) ] model.fit(x=train_images, y=train_labels, epochs=3,callbacks=callbacks) Ce qui donne comme résultat : .. image:: exemple.png :scale: 70% Archiver les métriques ---------------------- Afin de tracer des courbes à la fin de plusieurs epochs, surtout si vous êtes interrompues par des arrêts de session, il peut être intéressant de sauvegarder les métriques dans un fichier. .. code-block:: folder = '/content/GoogleDrive/MyDrive/' callbacks = [ keras.callbacks.ModelCheckpoint(folder+'network.keras', verbose = True), keras.callbacks.CSVLogger(folder+'model_history_log.csv', append=True) ] model.fit(x=train_images, y=train_labels, epochs=3,callbacks=callbacks)